package com.xiejr.controller;


import com.baomidou.mybatisplus.core.toolkit.SerializationUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiejr.annotations.ApiSecurityIgnore;
import com.xiejr.api.dto.product.ItemsSpecDTO;
import com.xiejr.api.interfaces.product.ProductService;
import com.xiejr.converter.ItemsSpecConverter;
import com.xiejr.entity.ItemsSpec;
import com.xiejr.model.entity.BaseEntity;
import com.xiejr.service.ItemsSpecService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.io.Serializable;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
 * 商品规格 每一件商品都有不同的规格，不同的规格又有不同的价格和优惠力度，规格表为此设计(ItemsSpec)表控制层
 *
 * @author mobai
 * @since 2021-02-11 22:45:28
 */
@RestController
@RequestMapping("specs")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
@Slf4j
@Api(value = "商品规格 每一件商品都有不同的规格，不同的规格又有不同的价格和优惠力度，规格表为此设计 控制器", tags = {"商品规格 每一件商品都有不同的规格，不同的规格又有不同的价格和优惠力度，规格表为此设计 接口"})
public class ItemsSpecController implements ProductService {
    /**
     * 商品规格 每一件商品都有不同的规格，不同的规格又有不同的价格和优惠力度，规格表为此设计 服务对象
     */
    private final ItemsSpecService itemsSpecService;


    /**
     * 商品规格 每一件商品都有不同的规格，不同的规格又有不同的价格和优惠力度，规格表为此设计 领域对象转换器
     */
    private final ItemsSpecConverter itemsSpecConvertor;

    private final JdbcTemplate jdbcTemplate;



    /**
     * 获取所有
     *
     * @return 所有数据
     */
    @ApiOperation("获取所有")
    @GetMapping("/all")
    public List<ItemsSpec> all() {
        return this.itemsSpecService.list();
    }


    /**
     * 插入单条数据
     *
     * @param param 待插入数据
     * @return void
     */
    @ApiOperation("插入数据")
    @PostMapping("")
    public void insert(@RequestBody @Valid ItemsSpecDTO param) {
        ItemsSpec entity = this.itemsSpecConvertor.dtoToEntity(param);
        this.itemsSpecService.save(entity);
    }


    /**
     * 根据id删除数据
     *
     * @param id 主键
     * @return void
     */
    @ApiOperation("根据ID删除数据")
    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable String id) {
        this.itemsSpecService.removeById(id);
    }

    @Override
    @ApiSecurityIgnore
    public ItemsSpecDTO getByItemIdAndSpecId(@NonNull String itemId, @NonNull String specId) {
        val result = itemsSpecService.getOne(Wrappers.<ItemsSpec>lambdaQuery().eq(ItemsSpec::getId, specId).eq(ItemsSpec::getItemId, itemId), true);
        return itemsSpecConvertor.entityToDto(result);
    }

    @Override
    @ApiSecurityIgnore
    public void deductInventory(String specId) {
        ItemsSpec byId = itemsSpecService.getById(specId);
        byId.setStock(byId.getStock()-1);
        itemsSpecService.updateById(byId);

    }

    @ApiSecurityIgnore
    @PostMapping("placeOrder")
    public synchronized   String placeOrder(String itemId,String specId){
        val result = itemsSpecService.getOne(Wrappers.<ItemsSpec>lambdaQuery().eq(ItemsSpec::getId, specId).eq(ItemsSpec::getItemId, itemId), true);
        if (result.getStock()>0){
            val update=jdbcTemplate.update("update items_spec set stock=stock-1 where id=? and item_id=?",specId,itemId);
            if (update>0){
                log.info("线程{}成功下单",Thread.currentThread().getName());
            }
            return "success";
        }
        return "failure";
    }



}